如果你正在學 ruby 那可能會覺得當你在使用 "self" 會非常困惑,他是怎麼運作的?到底什麼是 "self"?
這是 ruby 給你的關鍵字,透過"self"你可以讀取目前這個物件,如果你不知道什麼是物件,那你可能要搞清楚,因為這跟物件導向程式設計有關,
讀取“當下這個物件“取決你的程式前後關係。前後關係?是的就是取決與你豆底在哪裡使用 "self"。舉個例子:
如果你的程式碼在一個實體方法裡面,那 "self" 就是在那個類別裡面的一個實體。換句話說,"self"是一個物件。
試著執行這段程式碼:
def coffee
puts self
end
coffee
# main
這段程式碼定義並且呼叫了一個 coffee 方法,這個方法會印出"self"的值。那為什麼他會印出 main? 因為這是最高層級物件的名稱,這是一個物件,你可能也會在找到這些被定義在類別之外的方法。像是這裡的"coffee"方法。假設你在 cat 定義一個方法,那"self"就會是一個貓物件。
class Cat
def meow
puts self
end
end
Cat.new.meow
# <Cat:0x7a14c5>
根據這些範例,我們可以說 "self" 的值取決於你在哪裡使用它。
到這裡我們先讓子彈飛一會...
two hours later...
相信你透過瞭解 "self",會對他如何使用更清楚。為什麼 "self" 有用?
其中一個實務上的用法是可以明確的指出方法跟變數的不同,如果你不小心把變數跟方法取同一個名字又或者你必須在那種環境下工作,那你就可以使用這招 self.method_name
呼叫方法,意思就是說:
class Example
def do_something
banana = "variable"
puts banana
puts self.banana
end
def banana
"method"
end
end
Example.new.do_something
# "variable" => puts banana
# "method" => puts self.banana
這裡我們有一個 banana 變數在 do_something 方法裡,但是我們也可以有一個 banana 方法。
在這裡如果我們想要呼叫 banana 方法,而不是印出 banana 變數的值,這就是為什麼我們需要使用 self,因為變數優先
我們看看較常見的例子,定義一個類別方法,使用 self 定義一個類別層級的方法。
首先,這些方法的定義會長這樣:
class Salad
def self.buy_olive_oil
# ...
end
end
Salad.buy_olive_oil
這個 self 在這裡相當於 salad 這個類別,為什麼他有用,因為我們不需要對每個方法定義使用類別名稱,這讓我們更方便地去使用,如果今天我們改了這個類別的名稱。這也提高了程式碼的可讀性
這就是為什麼你應該使用 self.buy_olive_oil
而不是 Salad.buy_olive_oil
你可以在一個方法裡面對兩個物件做比較
先舉個例子:
def ==(other)
self == other
end
你也可以使用 self 來 debug,來去找到你到底正在使用哪個物件。
舉個例子:
p self
又或者你可以使用 self 當一個回傳值,像這樣:
class Salad
def initialize
@ingredients = []
end
def add_nuts
@ingredients << :nuts
self
end
end
my_salad = Salad.new.add_nuts
總的來說,"self"有很多種用法
Define class-level methods
Use an instance method when you have a local variable of the same name
Returning Self (builder pattern)
Debugging
Comparing objects (==)
Default receiver of method calls
Self vs Itself
以上這些有興趣都可以深入研究,寶藏就在那,自己去找吧